12. 向量存储

向量内存存储

之前提过,向量不是 C++ 中最高效的变量。其中一个原因是,声明向量变量时,不需要指定向量长度。因此,编译器不会提前知道需要分配多少内存。一旦向量长度超出了初始分配内存,整个向量就会被复制到空间更大的新 RAM 位置。

如果向vector容器插入值之前即可指定向量的长度,向量会更高效。这可以通过 reverse() 方法实现。该方法能保证向量可以存储预留的元素数。

举例

下面是一个 reserve() 方法的例子:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> myvector;
    int vector_size = 50;
    myvector.reserve(vector_size);

    for (int i = 0; i < vector_size; i++) {
        myvector.push_back(i);
    }

    return 0;
}

在 C++ 中,有多种方式可以初始化一个二维向量。优化你的程序时,你需要测试不同的初始化方式,确定哪种方式对你的程序效果最好。

要保证速度最快,需要考虑向量长度和类型。

练习

在接下来的练习中,你会看到三个不同的函数,分别在三个文件中:

  • zeros.cpp
  • unreserved.cpp
  • initializer.cpp

你的任务是修改 reserved.cpp 中的代码,保证在使用 push_back 方法前预定二维向量变量和一维向量变量的大小。你会看到,修改后代码速度有无提升。

unreserved() 函数会使用一个 for 循环来初始化一个二维向量。initializer() 函数使用标准库方法初始化向量。reserved.cpp 中的代码和 unreserved.cpp 中的代码完全一样。你的任务是使用 reserve() 方法来修改 reserved.cpp 文件。